Implied Null Object

호출과 집행 두 가지 절차로 로깅을 나누어서 처리한다.
(인터페이스 종속된 부분(호출)과 실제 로그를 저장하는 부분(집행)을 구분해서 구현)
struct OptionalLogger: Logger{
shared_ptr<Logger> impl;
static shared_ptr<Logger> no_logging;
Logger(const shared_ptr<Logger>& logger): impl(logger) {}
virtual void info(const string& s) override {
if(impl) impl->info(s); // null
}
// ...
};
// static (null object)
shared_ptr<Logger> BankAccount::no_logging{};
shared_ptr<OptionalLogger> logger;
BankAccount(const string& name, int balance, const shared_ptr<Logger>& logger=no_logging): log{make_shared<OptionalLogger>(logger)}, name(name), balance(balance) {}
//
BankAccount account{"primary account", 1000};
accoutn.deposit(2000);
Pimpl을 이용함